package com.huige.advice;

import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author 朱志辉
 * @Create 2024/7/14 上午11:13
 * @Version 1.0
 * Description:  增强类的内部要存储增强代码
 *
 *       1.定义方法存储增强代码
 *          具体定义几个方法，根据插入的位置决定的
 *       2.使用注解配置 指定插入目标方法的位置
 *            前置  @Before
 *            后置  @AfterReturning
 *            异常  @AfterThrowing
 *            返回  @After
 *            环绕  @Around
 *
 *        try{
 *             前置
 *            目标方法执行
 *            后置
 *        }catch(){
 *
 *          异常
 *
 *        }finally{
 *            返回
 *        }
 *
 *      3.配置切点表达式【选中插入的方法  切点】
 *
 *      4.补全注解
 *          加入ioc容器 @Component
 *          配置切面  @Aspect = 切点 + 增强
 *
 *      spring aop 重点 配置 -》jdk/cglib代理
 *
 *      5.开启@Aspect注解切面
 *
 */
@Aspect
@Component
public class LogAdvice {


    /**
     *  TODO：切点表达式
     *       固定语法：execution(访问修饰符 返回值 包名.类名.方法名(参数列表))
     *
     */


    /**
     * TODO：切点表达式的提取和复用
     *       1.当前类中提取
     *           定义一个空方法
     *           注解 @Pointcut("切点表达式")
     *           增强注解中引用切点表达式的方法即可
     *       2.创建一个存储切点的类
     *          单独维护切点表达式
     *          其他类的切点方法 类的权限符号.方法名()
     *
     */

    @Before("com.huige.pointcut.MyPointCut.pc()")
    public void start() {
        System.out.println("方法开始了");
    }

    @After("com.huige.pointcut.MyPointCut.pc()")
    public void end() {
        System.out.println("方法结束了");
    }

    @AfterThrowing("com.huige.pointcut.MyPointCut.pc()")
    public void exception() {
        System.out.println("方法异常了");
    }


}
